package com.wedjg.concurrency.example.singleton;

import com.wedjg.concurrency.annotations.NotRecommend;
import com.wedjg.concurrency.annotations.NotThreadSafe;
import com.wedjg.concurrency.annotations.ThreadSafe;

/**
 * 懒汉式单例
 * 安全发布对象
 * 但是不一定是线程安全的，因为：
 * JVM和CPU优化，会发生指令重排序
 * 1、 分配对象的内存空间
 * 2、 初始化对象
 * 3、 使对象指向刚分配的内存
 * 其中2和3有可能发生指令重排序
 *
 * @author wedjg
 * @version 1.0
 * @date 2019/6/2
 */
@NotThreadSafe
public class SingletonExample4 {

    private static SingletonExample4 instance = null;

    private SingletonExample4() {
    }

    public static SingletonExample4 getInstance() {
        // 双重检测机制
        if (instance == null) {
            synchronized (SingletonExample4.class) {
                if (instance == null) {
                    instance = new SingletonExample4();
                }
            }

        }
        return instance;
    }
}
